
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <docs>https://www.rssboard.org/rss-specification</docs>
    <generator>Statique v0.1.0</generator>
    <lastBuildDate>Sun, 24 May 2026 18:09:32 +0000</lastBuildDate>
    <copyright>Licensed under CC BY-NC 4.0, 2026 vavakado (Vladimir Rubin)</copyright>
    <managingEditor>me@vavakado.xyz (Kiran Rubin)</managingEditor>
    <webMaster>xor@vavakado.xyz (Vladimir Rubin)</webMaster>

<title>блог vavakado</title>
<language>ru</language>
<link>https://vavakado.xyz/ru</link>
<description>ну я тут постю всякое. :3</description>
<atom:link href="https://vavakado.xyz/ru-rss.xml" rel="self" type="application/rss+xml" />

<item>
<title>последняя зажжёная свеча</title>
<description>микрофикшн, который я написал</description>
<content:encoded><![CDATA[<p>там сидит монах, в каком‑то грязном подвале. ни души вокруг.</p>
<p>он верит в набор идей, ныне считающихся странными, а когда-то, распространённой религией. однако, сейчас он совершенно один.</p>
<p>в углу комнаты лежит старая коробка со свечами. когда-то она была полной, но теперь осталась только одна.<br />
он достаёт её, зажигает и ставит на влажный пол. огонь потихоньку поедает воск.</p>
<p>он медитирует, сосредоточившись на мерцающем пламени. в воздухе витает ощущение чего-то важного, что заканчивается.<br />
корпорации перестали делать хорошие свечи уже как полтысячи лет, когда настоящий воск признали неприбыльным. единственная альтернатива - отвратительные синтетические.</p>
<p>как огонь постепенно гаснет, так гаснет и он.</p>
<p>он - последний, кто достигает просветления.</p>
<p>осознанность была неприбыльна для капитала, поэтому они заставили нас от неё избавиться.</p>
]]></content:encoded>
<link>https://vavakado.xyz/ru/blog/last-candle</link>
<guid>https://vavakado.xyz/ru/blog/last-candle</guid>
<pubDate>Thu, 02 Apr 2026 00:00:00 +0000</pubDate>
</item>


<item>
<title>cold wind</title>
<description>хайку про один случай который у меня был</description>
<content:encoded><![CDATA[<p>the cold wind blowing<br />
as sleepy bees buzz around<br />
one in mountain peace</p>
]]></content:encoded>
<link>https://vavakado.xyz/ru/blog/cold-wind</link>
<guid>https://vavakado.xyz/ru/blog/cold-wind</guid>
<pubDate>Mon, 23 Mar 2026 00:00:00 +0000</pubDate>
</item>


<item>
<title>thought up promises</title>
<description>стих про то как разум придумывает вещи которых не существует</description>
<content:encoded><![CDATA[<p>не буду переводить это на русский, боюсь что потеряет суть</p>
<p>thought up promises<br />
always end sad or bad<br />
they feel like lies<br />
overwhelm even a notepad</p>
<p>they taste like rust and chain<br />
choking you from inside<br />
and you can’t explain<br />
the reason your soul just died</p>
<p>someone might think<br />
that that’s just a wink<br />
but your mind<br />
already wants to bind</p>
]]></content:encoded>
<link>https://vavakado.xyz/ru/blog/thought-up-promises</link>
<guid>https://vavakado.xyz/ru/blog/thought-up-promises</guid>
<pubDate>Thu, 09 Oct 2025 00:00:00 +0000</pubDate>
</item>


<item>
<title>la declara de asurda</title>
<description>манифест абсурда</description>
<content:encoded><![CDATA[<ol>
<li>ничего не имеет значения. радуйтесь этому.</li>
<li>будьте странными. жизнь слишком коротка, чтобы быть скучными.</li>
<li>незнание - это нормально.</li>
<li>смейтесь над совершенством. оно скучное.</li>
<li>было весело, но “провалились”? вы всё равно выиграли.</li>
<li>пробуйте идентичности, как наряды. иногда они подходят и остаются.</li>
<li>всему приходит конец. перестаньте беспокоиться и живите настоящими.</li>
</ol>
<p>вдохновлено “the cult of done manifesto”</p>
<p>P.S. почему название на элэфэн? хз, мне так захотелось</p>
]]></content:encoded>
<link>https://vavakado.xyz/ru/blog/la-declara-de-absura</link>
<guid>https://vavakado.xyz/ru/blog/la-declara-de-absura</guid>
<pubDate>Sun, 28 Sep 2025 00:00:00 +0000</pubDate>
</item>


<item>
<title>Мой язык программирования: часть 1</title>
<description>Как я решил переписать свой язык на 13 разных языках</description>
<content:encoded><![CDATA[<h2 id="сама-идея">Сама идея</h2>
<p>Сижу я, значит, и думаю о Lisp-подобных языках. А тут как понял что не так много Lispов имеют поддержку АТД, а это реально грустно, учитывая то как <a href="https://mas.to/@vavakado/115017454497008746">Я люблю АТД</a>. Они позволяют легко представлять почти любые данные(это всё на самом деле были emunы), строить AST, хранить состяние игр и т.д. Например, этот код</p>
<pre><code>#[derive(Debug)]
enum IpAddr {
    V4(u8, u8, u8, u8),
    V6(u16, u16, u16, u16, u16, u16, u16, u16),
}

let v4 = IpAddr::V4(127, 0,0,1);
println!("{v4:?}");
// а потом на это можно делать pattern-matching и так далее

match v4 {
    IpAddr::V4(127, x, y, z) =&gt; println!("локальный"),
    IpAddr::V4(g, x, y, z) =&gt; println!("generic v4"),
    _ =&gt; println!("что то другое"),
}
</code></pre>
<p>что даёт в результате</p>
<pre><code>V4(127, 0, 0, 1)
локальный
</code></pre>
<p>Так что конечно, как любой нормальный человек, я просто решил написать свой собственный игрушечный Lisp с ADT - это было бы реально весёлое упражнение в области программирования в которой у меня нету опыта. О, и раз уж я, видимо, люблю страдать, я решил ограничится <em>только</em> стандартной библиотекой, ради минимализма. И я назвал его Blip, потому что, ну… не знаю, просто захотелось так назвать.</p>
<h2 id="начало">Начало</h2>
<p>Но в этот раз мне не хотелось писать свой эксперимент на Rust, потому что у меня уже было 3 (<a href="https://git.vavakado.xyz/vavakado/website">этот сайт</a>, <a href="https://git.vavakado.xyz/vavakado/hinoirisetr">hinoirisetr</a> и shanti<sup><em>неопубликован</em></sup>) активных проекта на нём. Я хотел попробовать что-то <em>новое</em>. Мой выбор упал на <a href="https://odin-lang.org/">Odin</a>, потому что он выглядел подходящим для задачи. У него ручное управление памятью и приятный синтаксис. В целом, я бы описал его как смесь Jai, Go и C. Да, он всё ещё не такой развитый как C или Rust или Zig, но вообще важна ли развитость для игрушечных личных проектов(нет). Так что я написал небольшую <a href="https://git.vavakado.xyz/vavakado/blip/src/commit/3c42b3a5c9bf4219f9841ebed069d16bf70e4f23">базовую реализацию</a> на Odin, и она работала весьма хорошо пока я не… Не запустила её с <code>valgrind</code> и увидела что она утекала память, и мой окисленный мозг сказал <em>“О нет, это недопустимо!!”</em> - и конечно вместо того чтобы просто исправить Odin версию я просто решила “а почему бы не переписать Blip на другом языке”. Немного подумав, я выбрала <a href="https://ocaml.org">OCaml</a> как язык для переписи, и решила “какая же прекрасная идея, OCaml это именно то, что мне было нужно, что то между Rust и Haskell(когда я пытался выучить Haskell мой мозг свернулся в трубочку)”, да и я хотел побаловаться с ФП побольше, так что перепись на OCaml.</p>
<h2 id="ocaml">OCaml</h2>
<p>OCaml казался приятным… Но мой LSP сервер отказался работать без <code>dune</code>, а это очень неприятно, поскольку я хотел использовать простой <code>Makefile</code> (для минимализма). Хм, ну ладно, я предпочитаю удобство перед минимализмом, так что я перешёл на <code>dune</code>. Увидел что есть папка для тестов, и решил написать несколько… Только чтобы понять что мне нужна библиотека, просто чтобы писать ТЕСТЫ?!? Ваша билд система создала директорию для тестов, так почему вы не представляете утилиты для них? У меня 0 оправданий за то, что мне пришлось писать это</p>
<pre><code>let assert_equal name printer expected actual : bool =
  let green = "\027[32m" in
  let red = "\027[31m" in
  let reset = "\027[0m" in
  if expected = actual then (
    Printf.printf "%s[PASS]%s %s\n" green reset name;
    true)
  else (
    Printf.printf "%s[FAIL]%s %s: expected %s but got %s\n" red reset name
      (printer expected) (printer actual);
    false)
</code></pre>
<p>Да, возможно это моя вина за то что я не пользуюсь зависимостями, но обычно ожидаешь что современный язык будет предлагать утилиты для тестов… Ну или хотя-бы не пихать директорию <code>tests/</code> в лицо. О, а я уже рассказала про загадочные ошибки компилятора? Ну, у OCaml и они есть. Компилятор зачастую показывает ошибку на линию выше или ниже чем она реально находится и говорит что-то о “invalid syntax”. Возможно я просто плохо знаю функциональное программирование и пишу плохой код, но почему мне надо оборачивать половину <code>match</code> кейсов в блок <code>()</code>?…
На этот момент, Blip уже был не просто Lispом - он был целым цирком переписей. Каждый язык на который я смотел выглядел как подходящая опция: Zig, D, C, Vale, Hare, исправить Odin версию(лол, нет), C3, Nim.</p>
<h2 id="zig">Zig</h2>
<p>Zig казался естественным следующим шагом: Я слышала о нем уже весьма давно, и он определенно подходил для этого проекта с его ручным управлением памятью и всем таким. О, и, конечно, Zigуаны не умолкали, рассказывая о том, насколько крутым является <code>comptime</code>. Но, по иронии судьбы, в итоге я использовал его всего 4 раза в ~860 строках кода, и все разы для реализации <code>std.fmt.Format</code>. Так что, да, это не совсем та мега-макросистема, которую я ожидал. Но, тем не менее, мне очень понравился Zig. Его модель управления памятью упростила использование арен, в нем есть хороший паттерн-матчинг для тегированных объединений(tagged unionов). В целом, я была доволена. Но на полпути к переписыванию интерпретатора в Zig мне пришла в голову идея, что я должен протестировать и сравнить все реализации. Но тестировать только 2-3 имплементации не так весело. Поэтому я решил превратить Blip из проекта по созданию языка программирования в эксперимент: “реализовать один и тот же крошечный интерпретатор на множестве языков, а затем сравнить эргономику и производительность”. С новыми целями в голове, я объединил Zig и OCaml в одну ветку(<a href="https://git.vavakado.xyz/vavakado/blip/commit/555bfafe12d7b6dea7352cc2b2025f3a036017b1">коммит</a>), доработал реализацию на Zig и начал работать над утилитой бенчмаркинга (по иронии судьбы, написанной на Rust).</p>
<h2 id="с">С</h2>
<p>Старый (я использовал C99), минималистичный, портативный. Так я бы описала C. А из-за его небольшого размера я снял ограничение “только stdlib” и использовал <a href="https://github.com/tsoding/nob.h">nob.h</a>, в конце концов, я фанат Tsoding, лол. И я слишком нуб, чтобы писать свои собственные динамические массивы/арены и все такое (да, я ленивый, я знаю). На момент публикации я еще не закончил эту реализацию, но уже столкнулся с некоторыми проблемами:</p>
<h3 id="работа-с-аренами">Работа с аренами</h3>
<p>В C нет встроенных утилит для использования аллокаторов арены, поэтому использование арены для хранения строк в дереве токенов было неудобным. Поскольку я использую арену для хранения всех строк и идентификаторов, мне также приходится передавать весь массив <code>TokenArray</code> в функцию <code>token_to_str</code>, даже если она форматирует только один <code>Token</code>.</p>
<h3 id="отсутствие-неймспейcинга">Отсутствие неймспейcинга</h3>
<p>Это была первая проблема, которую я заметил. Теперь, вместо нормального неймспейсинга, мне пришлось называть все варианты енама <code>TOKEN_LPAREN</code> вместо простого <code>LPAREN</code>, потому что в противном случае я получал ошибку о коллизиях.</p>
<h3 id="необходимость-использования-h">Необходимость использования .h</h3>
<p>Да, это небольшая проблема, но она все же ухудшает впечатления от работы.</p>
<h3 id="настройки-компилятора-по-умолчанию">Настройки компилятора по умолчанию</h3>
<p>Чтобы получить действительно полезные ошибки/предупреждения, мне нужно было использовать следующие параметры компилятора: <code>-g -fsanitize=address,undefined -fno-omit-frame-pointer -Wshadow -Wall -Wextra</code>. Что это такое??? Я понимаю, что C — это СТАРЫЙ язык, но мне это действительно не нравится.</p>
<h2 id="запланированные-следующие-шаги">Запланированные следующие шаги</h2>
<p>Написать остальные имплементации, после чего я оценю каждую из них на основе опыта разработчика, используя 5 критериев (шкала от 1 до 5, общее количество баллов ≥15/25 для прохождения):</p>
<ul>
<li>Ясность синтаксиса</li>
<li>Билд система</li>
<li>Опыт дебаггинга</li>
<li>Стандартная библиотека</li>
<li>Качество ошибок</li>
</ul>
<p>Конечно, судьей буду я, так как это мой любительский проект :). Лично я считаю, что это самые важные вещи для языка, и я хочу быть абсолютно уверен, так как окончательным победителем станет язык, который я буду использовать для реализации остальных своих идей для Blip.
После отбора языков я добавлю больше функций в каждый из интерпретаторов:</p>
<ul>
<li>Функции</li>
<li>Переменные</li>
<li>Разветвления</li>
<li>Операции со списками</li>
<li>Рекурсия</li>
</ul>
<p>А ПОТОМ проведу тестирование с помощью утилиты <a href="https://git.vavakado.xyz/vavakado/blip/src/branch/main/bench">bench</a>, которую я написал (позже я также добавлю к ней тесты на соответствие спецификациям), поскольку, конечно, я предпочитаю, чтобы мой язык имел хорошую производительность.
Все языки, которые я планирую использовать, перечислены в README.md, но я приведу более подробные обоснования в следующих частях.</p>
<p>На этом все, но ждите продолжения, где я расскажу о некоторых других языках (Nim, D и еще C) и о прочем.</p>
<h2 id="references">REFERENCES</h2>
<ul>
<li><a href="https://ru.wikipedia.org/wiki/%D0%90%D0%BB%D0%B3%D0%B5%D0%B1%D1%80%D0%B0%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D1%82%D0%B8%D0%BF_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85">Алгебраические типы данных</a></li>
<li><a href="https://git.vavakado.xyz/vavakado/blip">Blip</a></li>
<li><a href="https://twitch.tv/tsoding">tsoding</a></li>
<li><a href="https://ocaml.org">OCaml</a></li>
<li><a href="https://ziglang.org">Zig</a></li>
<li><a href="https://odin-lang.org">Odin</a></li>
<li><a href="https://http://rust-lang.org/">Rust</a></li>
<li><a href="https://www.c-language.org/">C</a></li>
<li><a href="https://github.com/tsoding/nob.h">nob.h</a></li>
<li><a href="https://nim-lang.org/">Nim</a></li>
<li><a href="https://dlang.org/">D</a></li>
</ul>
]]></content:encoded>
<link>https://vavakado.xyz/ru/blog/my-own-language</link>
<guid>https://vavakado.xyz/ru/blog/my-own-language</guid>
<pubDate>Wed, 17 Sep 2025 00:00:00 +0000</pubDate>
</item>
</channel></rss>